Only a couple of command really use this features, so it's clearer just to print json right on the spot rather then return it though the call stack.
Compilation can be customized with the `bench` profile in the manifest.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
let root = find_root_manifest_for_wd(options.flag_manifest_path, config.cwd())?;
config.configure(options.flag_verbose,
options.flag_quiet,
let ws = Workspace::new(&root, config)?;
let err = ops::run_benches(&ws, &ops, &options.arg_args)?;
match err {
- None => Ok(None),
+ None => Ok(()),
Some(err) => {
Err(match err.exit.as_ref().and_then(|e| e.code()) {
Some(i) => CliError::new(human("bench failed"), i),
the --release flag will use the `release` profile instead.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-build; args={:?}",
env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
let ws = Workspace::new(&root, config)?;
ops::compile(&ws, &opts)?;
- Ok(None)
+ Ok(())
}
match result {
Err(e) => cargo::handle_cli_error(e, &mut *config.shell()),
- Ok(None) => {},
- Ok(Some(())) => unreachable!(),
+ Ok(()) => {},
}
}
because they are fundamental (and intertwined). Other commands can rely
on this top-level information.
*/
-fn execute(flags: Flags, config: &Config) -> CliResult<Option<()>> {
+fn execute(flags: Flags, config: &Config) -> CliResult {
config.configure(flags.flag_verbose,
flags.flag_quiet,
&flags.flag_color,
}
}
}
- return Ok(None)
+ return Ok(())
}
if flags.flag_list {
for command in list_commands(config) {
println!(" {}", command);
};
- return Ok(None)
+ return Ok(())
}
if let Some(ref code) = flags.flag_explain {
let mut procss = config.rustc()?.process();
procss.arg("--explain").arg(code).exec().map_err(human)?;
- return Ok(None)
+ return Ok(())
}
let args = match &flags.arg_command[..] {
let r = cargo::call_main_without_stdin(execute, config, USAGE, args,
false);
cargo::process_executed(r, &mut config.shell());
- return Ok(None)
+ return Ok(())
}
// For `cargo help -h` and `cargo help --help`, print out the help
};
if try_execute(&config, &args) {
- return Ok(None)
+ return Ok(())
}
let alias_list = aliased_command(&config, &args[1])?;
.map(|s| s.to_string())
.collect::<Vec<_>>();
if try_execute(&config, &chain) {
- return Ok(None)
+ return Ok(())
} else {
chain
}
None => args,
};
execute_subcommand(config, &args[1], &args)?;
- Ok(None)
+ Ok(())
}
fn try_execute(config: &Config, args: &[String]) -> bool {
fn execute_subcommand(config: &Config,
cmd: &str,
- args: &[String]) -> CliResult<()> {
+ args: &[String]) -> CliResult {
let command_exe = format!("cargo-{}{}", cmd, env::consts::EXE_SUFFIX);
let path = search_directories(config)
.iter()
flag_frozen: bool,
}
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-check; args={:?}",
env::args().collect::<Vec<_>>());
};
ops::compile(&ws, &opts)?;
- Ok(None)
+ Ok(())
}
and its format, see the `cargo help pkgid` command.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-clean; args={:?}", env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
options.flag_quiet,
};
let ws = Workspace::new(&root, config)?;
ops::clean(&ws, &opts)?;
- Ok(None)
+ Ok(())
}
the `cargo help pkgid` command.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let ws = Workspace::new(&root, config)?;
ops::doc(&ws, &doc_opts)?;
- Ok(None)
+ Ok(())
}
all updated.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let root = find_root_manifest_for_wd(options.flag_manifest_path, config.cwd())?;
let ws = Workspace::new(&root, config)?;
ops::fetch(&ws)?;
- Ok(None)
+ Ok(())
}
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-generate-lockfile; args={:?}", env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
options.flag_quiet,
let ws = Workspace::new(&root, config)?;
ops::generate_lockfile(&ws)?;
- Ok(None)
+ Ok(())
}
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
source.update()?;
- Ok(None)
+ Ok(())
}
-h, --help Print this message
";
-pub fn execute(_: Options, _: &Config) -> CliResult<Option<()>> {
+pub fn execute(_: Options, _: &Config) -> CliResult {
// This is a dummy command just so that `cargo help help` works.
// The actual delegation of help flag to subcommands is handled by the
// cargo command.
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-init; args={:?}", env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
options.flag_quiet,
if opts_lib { "library" }
else {"binary (application)"}))?;
- Ok(None)
+ Ok(())
}
The `--list` option will list all installed packages (and their versions).
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
} else {
ops::install(root, krate, &source, vers, &compile_opts, options.flag_force)?;
}
- Ok(None)
+ Ok(())
}
+use cargo;
use cargo::util::{CliResult, CliError, human, ChainError, Config};
use cargo::util::important_paths::{find_root_manifest_for_wd};
}
pub fn execute(flags: LocateProjectFlags,
- config: &Config) -> CliResult<Option<ProjectLocation>> {
+ config: &Config) -> CliResult {
let root = find_root_manifest_for_wd(flags.flag_manifest_path, config.cwd())?;
let string = root.to_str()
Unicode"))
.map_err(|e| CliError::new(e, 1))?;
- Ok(Some(ProjectLocation { root: string.to_string() }))
+ let location = ProjectLocation { root: string.to_string() };
+ cargo::print_json(&location);
+ Ok(())
}
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let token = token.trim().to_string();
ops::registry_login(config, token)?;
- Ok(None)
+ Ok(())
}
+use cargo;
use cargo::core::Workspace;
-use cargo::ops::{output_metadata, OutputMetadataOptions, ExportInfo};
+use cargo::ops::{output_metadata, OutputMetadataOptions};
use cargo::util::important_paths::find_root_manifest_for_wd;
use cargo::util::{CliResult, Config};
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<ExportInfo>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let ws = Workspace::new(&manifest, config)?;
let result = output_metadata(&ws, &options)?;
- Ok(Some(result))
+ cargo::print_json(&result);
+ Ok(())
}
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-new; args={:?}", env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
options.flag_quiet,
else {"binary (application)"},
arg_path))?;
- Ok(None)
+ Ok(())
}
and troubleshooting.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
list: options.flag_list,
};
ops::modify_owners(config, &opts)?;
- Ok(None)
+ Ok(())
}
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
allow_dirty: options.flag_allow_dirty,
jobs: options.flag_jobs,
})?;
- Ok(None)
+ Ok(())
}
";
pub fn execute(options: Options,
- config: &Config) -> CliResult<Option<()>> {
+ config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let spec = spec.as_ref().map(|s| &s[..]);
let spec = ops::pkgid(&ws, spec)?;
println!("{}", spec);
- Ok(None)
+ Ok(())
}
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
jobs: jobs,
dry_run: dry_run,
})?;
- Ok(None)
+ Ok(())
}
use std::env;
+use cargo;
use cargo::core::Package;
use cargo::util::{CliResult, Config};
use cargo::util::important_paths::{find_root_manifest_for_wd};
--color WHEN Coloring: auto, always, never
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<Package>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-read-manifest; args={:?}",
env::args().collect::<Vec<_>>());
config.shell().set_color_config(options.flag_color.as_ref().map(|s| &s[..]))?;
let root = find_root_manifest_for_wd(options.flag_manifest_path, config.cwd())?;
let pkg = Package::for_path(&root, config)?;
- Ok(Some(pkg))
+ cargo::print_json(&pkg);
+ Ok(())
}
the ones before go to Cargo.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let ws = Workspace::new(&root, config)?;
match ops::run(&ws, &compile_opts, &options.arg_args)? {
- None => Ok(None),
+ None => Ok(()),
Some(err) => {
// If we never actually spawned the process then that sounds pretty
// bad and we always want to forward that up.
`build.rustflags` configuration option.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-rustc; args={:?}",
env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
let ws = Workspace::new(&root, config)?;
ops::compile(&ws, &opts)?;
- Ok(None)
+ Ok(())
}
the `cargo help pkgid` command.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let ws = Workspace::new(&root, config)?;
ops::doc(&ws, &doc_opts)?;
- Ok(None)
+ Ok(())
}
--locked Require Cargo.lock is up to date
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
} = options;
ops::search(&query.join("+"), config, host, cmp::min(100, limit.unwrap_or(10)) as u8)?;
- Ok(None)
+ Ok(())
}
cargo test -- --help
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let ws = Workspace::new(&root, config)?;
let err = ops::run_tests(&ws, &ops, &options.arg_args)?;
match err {
- None => Ok(None),
+ None => Ok(()),
Some(err) => {
Err(match err.exit.as_ref().and_then(|e| e.code()) {
Some(i) => CliError::new(human("test failed"), i),
only uninstall particular binaries.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
let root = options.flag_root.as_ref().map(|s| &s[..]);
ops::uninstall(root, &options.arg_spec, &options.flag_bin, config)?;
- Ok(None)
+ Ok(())
}
For more information about package id specifications, see `cargo help pkgid`.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
debug!("executing; cmd=cargo-update; args={:?}", env::args().collect::<Vec<_>>());
config.configure(options.flag_verbose,
options.flag_quiet,
let ws = Workspace::new(&root, config)?;
ops::update_lockfile(&ws, &update_opts)?;
- Ok(None)
+ Ok(())
}
use std::io::prelude::*;
use std::process;
+use cargo;
use cargo::util::important_paths::{find_root_manifest_for_wd};
use cargo::util::{CliResult, Config};
use rustc_serialize::json;
use toml;
-pub type Error = HashMap<String, String>;
-
#[derive(RustcDecodable)]
pub struct Flags {
flag_manifest_path: Option<String>,
--locked Require Cargo.lock is up to date
";
-pub fn execute(args: Flags, config: &Config) -> CliResult<Option<Error>> {
+pub fn execute(args: Flags, config: &Config) -> CliResult {
config.configure(args.flag_verbose,
args.flag_quiet,
&args.flag_color,
let mut h = HashMap::new();
h.insert("success".to_string(), "true".to_string());
- Ok(Some(h))
+ cargo::print_json(&h);
+ Ok(())
}
fn fail(reason: &str, value: &str) -> ! {
--color WHEN Coloring: auto, always, never
";
-pub fn execute(_: Options, _: &Config) -> CliResult<Option<()>> {
+pub fn execute(_: Options, _: &Config) -> CliResult {
debug!("executing; cmd=cargo-version; args={:?}", env::args().collect::<Vec<_>>());
println!("{}", cargo::version());
- Ok(None)
+ Ok(())
}
crates to be locked to any yanked version.
";
-pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
+pub fn execute(options: Options, config: &Config) -> CliResult {
config.configure(options.flag_verbose,
options.flag_quiet,
&options.flag_color,
options.flag_token,
options.flag_index,
options.flag_undo)?;
- Ok(None)
+ Ok(())
}
}
}
-pub fn call_main_without_stdin<T, V>(
- exec: fn(T, &Config) -> CliResult<Option<V>>,
+pub fn call_main_without_stdin<Flags: Decodable>(
+ exec: fn(Flags, &Config) -> CliResult,
config: &Config,
usage: &str,
args: &[String],
- options_first: bool) -> CliResult<Option<V>>
- where V: Encodable, T: Decodable
+ options_first: bool) -> CliResult
{
- let flags = flags_from_args::<T>(usage, args, options_first)?;
+ let docopt = Docopt::new(usage).unwrap()
+ .options_first(options_first)
+ .argv(args.iter().map(|s| &s[..]))
+ .help(true);
+
+ let flags = docopt.decode().map_err(|e| {
+ let code = if e.fatal() {1} else {0};
+ CliError::new(human(e.to_string()), code)
+ })?;
+
exec(flags, config)
}
// This will diverge if `result` is an `Err` and return otherwise.
-pub fn process_executed<T>(result: CliResult<Option<T>>, shell: &mut MultiShell)
- where T: Encodable
+pub fn process_executed(result: CliResult, shell: &mut MultiShell)
{
match result {
Err(e) => handle_cli_error(e, shell),
- Ok(Some(encodable)) => {
- let encoded = json::encode(&encodable).unwrap();
- println!("{}", encoded);
- }
- Ok(None) => {}
+ Ok(()) => {}
}
}
+pub fn print_json<T: Encodable>(obj: &T) {
+ let encoded = json::encode(&obj).unwrap();
+ println!("{}", encoded);
+}
+
pub fn shell(verbosity: Verbosity, color_config: ColorConfig) -> MultiShell {
enum Output {
Stdout,
}
}
}
-
-fn flags_from_args<T>(usage: &str, args: &[String], options_first: bool) -> CliResult<T>
- where T: Decodable
-{
- let docopt = Docopt::new(usage).unwrap()
- .options_first(options_first)
- .argv(args.iter().map(|s| &s[..]))
- .help(true);
- docopt.decode().map_err(|e| {
- let code = if e.fatal() {1} else {0};
- CliError::new(human(e.to_string()), code)
- })
-}
// =============================================================================
// CLI errors
-pub type CliResult<T> = Result<T, CliError>;
+pub type CliResult = Result<(), CliError>;
#[derive(Debug)]
pub struct CliError {
}
-#[derive(RustcDecodable)]
-struct FooFlags {
- flag_version: bool,
-}
-
-fn real_main(flags: FooFlags, _config: &cargo::Config) ->
- cargo::CliResult<Option<String>> {
- if flags.flag_version {
- Ok(Some("foo <version>".to_string()))
- } else {
- Ok(None)
- }
-}
-
-#[test]
-fn subcommand_with_version_using_exec_main_without_stdin() {
- let usage = "
-Usage: cargo foo [--version]
-
-Options:
- -V, --version Print version info
-";
- let args: Vec<String> = vec!["cargo", "foo", "--version"]
- .into_iter().map(|s| s.to_string()).collect();
- let result = cargo::call_main_without_stdin(
- real_main, &cargo::Config::default().unwrap(),
- usage, &args, false);
- assert_eq!(result.unwrap(), Some("foo <version>".to_string()));
-}
#[test]
#[cfg_attr(target_os = "windows", ignore)]